home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 2 / Amiga Tools 2.iso / tex / macros / source / contrib / siam / siam.bst < prev    next >
Text File  |  1995-03-09  |  19KB  |  1,039 lines

  1. % ====================== SIAM.BST ================================ % 
  2. % SIAM bibliography style (24-Jan-88 version)
  3. %    numeric labels, alphabetic order, Mathematical Reviews abbreviations,
  4. %    names in \sc, titles in italics, book titles mixed upper-lower and
  5. %article
  6. %    titles lowercase, commas separate all fields except before "notes".
  7. %
  8. %   History
  9. %    1/30/86    (HWT)    Original version, by Howard Trickey.
  10. %    6/15/87    (HWT)    Fix format.editors---Martin Costabel.
  11. %    1/24/88    (OP&HWT) Updated for BibTeX version 0.99a, Oren Patashnik;
  12. %            THIS `siam' VERSION DOES NOT WORK WITH BIBTEX 0.98i.
  13.  
  14. ENTRY
  15.   { address
  16.     author
  17.     booktitle
  18.     chapter
  19.     edition
  20.     editor
  21.     howpublished
  22.     institution
  23.     journal
  24.     key
  25.     month
  26.     note
  27.     number
  28.     organization
  29.     pages
  30.     publisher
  31.     school
  32.     series
  33.     title
  34.     type
  35.     volume
  36.     year
  37.   }
  38.   {}
  39.   { label }
  40.  
  41. INTEGERS { output.state before.all mid.sentence after.block }
  42.  
  43. FUNCTION {init.state.consts}
  44. { #0 'before.all :=
  45.   #1 'mid.sentence :=
  46.   #2 'after.block :=
  47. }
  48.  
  49. STRINGS { s t }
  50.  
  51. FUNCTION {output.nonnull}
  52. { 's :=
  53.   output.state mid.sentence =
  54.     { ", " * write$ }
  55.     { output.state after.block =
  56.     { add.period$ write$
  57.       newline$
  58.       "\newblock " write$
  59.     }
  60.     'write$
  61.       if$
  62.       mid.sentence 'output.state :=
  63.     }
  64.   if$
  65.   s
  66. }
  67.  
  68. FUNCTION {output}
  69. { duplicate$ empty$
  70.     'pop$
  71.     'output.nonnull
  72.   if$
  73. }
  74.  
  75. FUNCTION {output.check}
  76. { 't :=
  77.   duplicate$ empty$
  78.     { pop$ "empty " t * " in " * cite$ * warning$ }
  79.     'output.nonnull
  80.   if$
  81. }
  82.  
  83. FUNCTION {output.bibitem}
  84. { newline$
  85.   "\bibitem{" write$
  86.   cite$ write$
  87.   "}" write$
  88.   newline$
  89.   ""
  90.   before.all 'output.state :=
  91. }
  92.  
  93. FUNCTION {fin.entry}
  94. { add.period$
  95.   write$
  96.   newline$
  97. }
  98.  
  99. FUNCTION {new.block}
  100. { output.state before.all =
  101.     'skip$
  102.     { after.block 'output.state := }
  103.   if$
  104. }
  105.  
  106. FUNCTION {not}
  107. {   { #0 }
  108.     { #1 }
  109.   if$
  110. }
  111.  
  112. FUNCTION {and}
  113. {   'skip$
  114.     { pop$ #0 }
  115.   if$
  116. }
  117.  
  118. FUNCTION {or}
  119. {   { pop$ #1 }
  120.     'skip$
  121.   if$
  122. }
  123.  
  124. FUNCTION {new.block.checka}
  125. { empty$
  126.     'skip$
  127.     'new.block
  128.   if$
  129. }
  130.  
  131. FUNCTION {field.or.null}
  132. { duplicate$ empty$
  133.     { pop$ "" }
  134.     'skip$
  135.   if$
  136. }
  137.  
  138. FUNCTION {emphasize}
  139. { duplicate$ empty$
  140.     { pop$ "" }
  141.     { "{\em " swap$ * "}" * }
  142.   if$
  143. }
  144.  
  145. FUNCTION {scapify}
  146. { duplicate$ empty$
  147.     { pop$ "" }
  148.     { "{\sc " swap$ * "}" * }
  149.   if$
  150. }
  151.  
  152. INTEGERS { nameptr namesleft numnames }
  153.  
  154. FUNCTION {format.names}
  155. { 's :=
  156.   #1 'nameptr :=
  157.   s num.names$ 'numnames :=
  158.   numnames 'namesleft :=
  159.     { namesleft #0 > }
  160.     { s nameptr "{f.~}{vv~}{ll}{, jj}" format.name$ 't :=
  161.       nameptr #1 >
  162.     { namesleft #1 >
  163.         { ", " * t * }
  164.         { numnames #2 >
  165.         { "," * }
  166.         'skip$
  167.           if$
  168.           t "others" =
  169.         { " et~al." * }
  170.         { " and " * t * }
  171.           if$
  172.         }
  173.       if$
  174.     }
  175.     't
  176.       if$
  177.       nameptr #1 + 'nameptr :=
  178.       namesleft #1 - 'namesleft :=
  179.     }
  180.   while$
  181. }
  182.  
  183. STRINGS { last.authors }
  184.  
  185. FUNCTION {init.last.authors}
  186. { "" 'last.authors :=
  187. }
  188.  
  189. FUNCTION {format.authors}
  190. { author empty$
  191.     { "" 'last.authors :=
  192.       ""
  193.     }
  194.     { author last.authors =
  195.         { "\leavevmode\vrule height 2pt depth -1.6pt width 23pt" }
  196.         { author format.names scapify }
  197.       if$
  198.       author 'last.authors :=
  199.     }
  200.   if$
  201. }
  202.  
  203. FUNCTION {format.organization}
  204. { organization empty$
  205.     { "" 'last.authors :=
  206.       ""
  207.     }
  208.     { organization last.authors =
  209.         { "\leavevmode\vrule height 2pt depth -1.6pt width 23pt" }
  210.         { organization scapify }
  211.       if$
  212.       organization 'last.authors :=
  213.     }
  214.   if$
  215. }
  216.  
  217. FUNCTION {format.editors}
  218. { editor empty$
  219.     { "" 'last.authors :=
  220.       ""
  221.     }
  222.     { editor last.authors =
  223.         { "\leavevmode\vrule height 2pt depth -1.6pt width 23pt" }
  224.     { editor format.names scapify }
  225.       if$
  226.       editor num.names$ #1 >
  227.         { ", eds." * }
  228.     { ", ed." * }
  229.       if$
  230.       editor 'last.authors :=
  231.     }
  232.   if$
  233. }
  234.  
  235. FUNCTION {format.ineditors}
  236. { editor empty$
  237.     { "" }
  238.     { editor format.names
  239.       editor num.names$ #1 >
  240.     { ", eds." * }
  241.     { ", ed." * }
  242.       if$
  243.     }
  244.   if$
  245. }
  246.  
  247. FUNCTION {format.title}
  248. { title empty$
  249.     { "" }
  250.     { title "t" change.case$ emphasize }
  251.   if$
  252. }
  253.  
  254. FUNCTION {n.dashify}
  255. { 't :=
  256.   ""
  257.     { t empty$ not }
  258.     { t #1 #1 substring$ "-" =
  259.     { t #1 #2 substring$ "--" = not
  260.         { "--" *
  261.           t #2 global.max$ substring$ 't :=
  262.         }
  263.         {   { t #1 #1 substring$ "-" = }
  264.         { "-" *
  265.           t #2 global.max$ substring$ 't :=
  266.         }
  267.           while$
  268.         }
  269.       if$
  270.     }
  271.     { t #1 #1 substring$ *
  272.       t #2 global.max$ substring$ 't :=
  273.     }
  274.       if$
  275.     }
  276.   while$
  277. }
  278.  
  279. FUNCTION {format.date}
  280. { year empty$
  281.     { month empty$
  282.     { "" }
  283.     { "there's a month but no year in " cite$ * warning$
  284.       month
  285.     }
  286.       if$
  287.     }
  288.     { month empty$
  289.     'year
  290.     { month " " * year * }
  291.       if$
  292.     }
  293.   if$
  294. }
  295.  
  296. FUNCTION {format.btitle}
  297. { title emphasize
  298. }
  299.  
  300. FUNCTION {tie.or.space.connect}
  301. { duplicate$ text.length$ #3 <
  302.     { "~" }
  303.     { " " }
  304.   if$
  305.   swap$ * *
  306. }
  307.  
  308. FUNCTION {either.or.check}
  309. { empty$
  310.     'pop$
  311.     { "can't use both " swap$ * " fields in " * cite$ * warning$ }
  312.   if$
  313. }
  314.  
  315. FUNCTION {format.bvolume}
  316. { volume empty$
  317.     { "" }
  318.     { "vol.~" volume *
  319.       series empty$
  320.     'skip$
  321.     { " of " * series * }
  322.       if$
  323.       "volume and number" number either.or.check
  324.     }
  325.   if$
  326. }
  327.  
  328. FUNCTION {format.number.series}
  329. { volume empty$
  330.     { number empty$
  331.     { series field.or.null }
  332.     { "no.~" number *
  333.       series empty$
  334.         { "there's a number but no series in " cite$ * warning$ }
  335.         { " in " * series * }
  336.       if$
  337.     }
  338.       if$
  339.     }
  340.     { "" }
  341.   if$
  342. }
  343.  
  344. FUNCTION {format.edition}
  345. { edition empty$
  346.     { "" }
  347.     { edition "l" change.case$ "~ed." * }
  348.   if$
  349. }
  350.  
  351. INTEGERS { multiresult }
  352.  
  353. FUNCTION {multi.page.check}
  354. { 't :=
  355.   #0 'multiresult :=
  356.     { multiresult not
  357.       t empty$ not
  358.       and
  359.     }
  360.     { t #1 #1 substring$
  361.       duplicate$ "-" =
  362.       swap$ duplicate$ "," =
  363.       swap$ "+" =
  364.       or or
  365.     { #1 'multiresult := }
  366.     { t #2 global.max$ substring$ 't := }
  367.       if$
  368.     }
  369.   while$
  370.   multiresult
  371. }
  372.  
  373. FUNCTION {format.pages}
  374. { pages empty$
  375.     { "" }
  376.     { pages multi.page.check
  377.     { "pp.~" pages n.dashify * }
  378.     { "p.~" pages * }
  379.       if$
  380.     }
  381.   if$
  382. }
  383.  
  384. FUNCTION {format.vol.year}
  385. { volume field.or.null
  386.   year empty$
  387.     { "empty year in " cite$ * warning$ }
  388.     { " (" year * ")" * * }
  389.   if$
  390. }
  391.  
  392. FUNCTION {format.chapter.pages}
  393. { chapter empty$
  394.     'format.pages
  395.     { type empty$
  396.     { "ch.~" chapter * }
  397.     { type "l" change.case$ chapter tie.or.space.connect }
  398.       if$
  399.       pages empty$
  400.     'skip$
  401.     { ", " * format.pages * }
  402.       if$
  403.     }
  404.   if$
  405. }
  406.  
  407. FUNCTION {format.in.ed.booktitle}
  408. { booktitle empty$
  409.     { "" }
  410.     { editor empty$
  411.     { "in " booktitle * }
  412.     { "in " booktitle * ", " * format.ineditors * }
  413.       if$
  414.     }
  415.   if$
  416. }
  417.  
  418. FUNCTION {empty.misc.check}
  419. { author empty$ title empty$ howpublished empty$
  420.   month empty$ year empty$ note empty$
  421.   and and and and and
  422.   key empty$ not and
  423.     { "all relevant fields are empty in " cite$ * warning$ }
  424.     'skip$
  425.   if$
  426. }
  427.  
  428. FUNCTION {format.thesis.type}
  429. { type empty$
  430.     'skip$
  431.     { pop$
  432.       type "l" change.case$
  433.     }
  434.   if$
  435. }
  436.  
  437. FUNCTION {format.tr.number}
  438. { type empty$
  439.     { "Tech. Report" }
  440.     'type
  441.   if$
  442.   number empty$
  443.     { "l" change.case$ }
  444.     { number tie.or.space.connect }
  445.   if$
  446. }
  447.  
  448. FUNCTION {format.article.crossref}
  449. { key empty$
  450.     { journal empty$
  451.     { "need key or journal for " cite$ * " to crossref " * crossref *
  452.       warning$
  453.       ""
  454.     }
  455.     { "in " journal * }
  456.       if$
  457.     }
  458.     { "in " key * }
  459.   if$
  460.   " \cite{" * crossref * "}" *
  461. }
  462.  
  463. FUNCTION {format.crossref.editor}
  464. { editor #1 "{vv~}{ll}" format.name$
  465.   editor num.names$ duplicate$
  466.   #2 >
  467.     { pop$ " et~al." * }
  468.     { #2 <
  469.     'skip$
  470.     { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
  471.         { " et~al." * }
  472.         { " and " * editor #2 "{vv~}{ll}" format.name$ * }
  473.       if$
  474.     }
  475.       if$
  476.     }
  477.   if$
  478. }
  479.  
  480. FUNCTION {format.book.crossref}
  481. { volume empty$
  482.     { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
  483.       "in "
  484.     }
  485.     { "vol.~" volume *
  486.       " of " *
  487.     }
  488.   if$
  489.   editor empty$
  490.   editor field.or.null author field.or.null =
  491.   or
  492.     { key empty$
  493.     { series empty$
  494.         { "need editor, key, or series for " cite$ * " to crossref " *
  495.           crossref * warning$
  496.           "" *
  497.         }
  498.         { series * }
  499.       if$
  500.     }
  501.     { key * }
  502.       if$
  503.     }
  504.     { format.crossref.editor * }
  505.   if$
  506.   " \cite{" * crossref * "}" *
  507. }
  508.  
  509. FUNCTION {format.incoll.inproc.crossref}
  510. { editor empty$
  511.   editor field.or.null author field.or.null =
  512.   or
  513.     { key empty$
  514.     { booktitle empty$
  515.         { "need editor, key, or booktitle for " cite$ * " to crossref " *
  516.           crossref * warning$
  517.           ""
  518.         }
  519.         { "in " booktitle * }
  520.       if$
  521.     }
  522.     { "in " key * }
  523.       if$
  524.     }
  525.     { "in " format.crossref.editor * }
  526.   if$
  527.   " \cite{" * crossref * "}" *
  528. }
  529.  
  530. FUNCTION {article}
  531. { output.bibitem
  532.   format.authors "author" output.check
  533.   format.title "title" output.check
  534.   crossref missing$
  535.     { journal "journal" output.check
  536.       format.vol.year output
  537.     }
  538.     { format.article.crossref output.nonnull }
  539.   if$
  540.   format.pages output
  541.   new.block
  542.   note output
  543.   fin.entry
  544. }
  545.  
  546. FUNCTION {book}
  547. { output.bibitem
  548.   author empty$
  549.     { format.editors "author and editor" output.check }
  550.     { format.authors output.nonnull
  551.       crossref missing$
  552.     { "author and editor" editor either.or.check }
  553.     'skip$
  554.       if$
  555.     }
  556.   if$
  557.   format.btitle "title" output.check
  558.   crossref missing$
  559.     { format.bvolume output
  560.       format.number.series output
  561.       publisher "publisher" output.check
  562.       address output
  563.     }
  564.     { format.book.crossref output.nonnull }
  565.   if$
  566.   format.edition output
  567.   format.date "year" output.check
  568.   new.block
  569.   note output
  570.   fin.entry
  571. }
  572.  
  573. FUNCTION {booklet}
  574. { output.bibitem
  575.   format.authors output
  576.   format.title "title" output.check
  577.   howpublished new.block.checka
  578.   howpublished output
  579.   address output
  580.   format.date output
  581.   new.block
  582.   note output
  583.   fin.entry
  584. }
  585.  
  586. FUNCTION {inbook}
  587. { output.bibitem
  588.   author empty$
  589.     { format.editors "author and editor" output.check }
  590.     { format.authors output.nonnull
  591.       crossref missing$
  592.     { "author and editor" editor either.or.check }
  593.     'skip$
  594.       if$
  595.     }
  596.   if$
  597.   format.btitle "title" output.check
  598.   crossref missing$
  599.     { format.bvolume output
  600.       format.number.series output
  601.       publisher "publisher" output.check
  602.       address output
  603.     }
  604.     { format.book.crossref output.nonnull }
  605.   if$
  606.   format.edition output
  607.   format.date "year" output.check
  608.   format.chapter.pages "chapter and pages" output.check
  609.   new.block
  610.   note output
  611.   fin.entry
  612. }
  613.  
  614. FUNCTION {incollection}
  615. { output.bibitem
  616.   format.authors "author" output.check
  617.   format.title "title" output.check
  618.   crossref missing$
  619.     { format.in.ed.booktitle "booktitle" output.check
  620.       format.bvolume output
  621.       format.number.series output
  622.       publisher "publisher" output.check
  623.       address output
  624.       format.edition output
  625.       format.date "year" output.check
  626.     }
  627.     { format.incoll.inproc.crossref output.nonnull }
  628.   if$
  629.   format.chapter.pages output
  630.   new.block
  631.   note output
  632.   fin.entry
  633. }
  634.  
  635. FUNCTION {inproceedings}
  636. { output.bibitem
  637.   format.authors "author" output.check
  638.   format.title "title" output.check
  639.   crossref missing$
  640.     { format.in.ed.booktitle "booktitle" output.check
  641.       format.bvolume output
  642.       format.number.series output
  643.       address empty$
  644.     { organization output
  645.       publisher output
  646.       format.date "year" output.check
  647.     }
  648.     { address output.nonnull
  649.       format.date "year" output.check
  650.       organization output
  651.       publisher output
  652.     }
  653.       if$
  654.     }
  655.     { format.incoll.inproc.crossref output.nonnull }
  656.   if$
  657.   format.pages output
  658.   new.block
  659.   note output
  660.   fin.entry
  661. }
  662.  
  663. FUNCTION {conference} { inproceedings }
  664.  
  665. FUNCTION {manual}
  666. { output.bibitem
  667.   author empty$
  668.     { format.organization output }
  669.     { format.authors output.nonnull }
  670.   if$
  671.   format.btitle "title" output.check
  672.   author empty$
  673.     'skip$
  674.     { organization output }
  675.   if$
  676.   address output
  677.   format.edition output
  678.   format.date output
  679.   new.block
  680.   note output
  681.   fin.entry
  682. }
  683.  
  684. FUNCTION {mastersthesis}
  685. { output.bibitem
  686.   format.authors "author" output.check
  687.   format.title "title" output.check
  688.   "master's thesis" format.thesis.type output.nonnull
  689.   school "school" output.check
  690.   address output
  691.   format.date "year" output.check
  692.   new.block
  693.   note output
  694.   fin.entry
  695. }
  696.  
  697. FUNCTION {misc}
  698. { output.bibitem
  699.   format.authors output
  700.   format.title output
  701.   howpublished new.block.checka
  702.   howpublished output
  703.   format.date output
  704.   new.block
  705.   note output
  706.   fin.entry
  707.   empty.misc.check
  708. }
  709.  
  710. FUNCTION {phdthesis}
  711. { output.bibitem
  712.   format.authors "author" output.check
  713.   format.btitle "title" output.check
  714.   "PhD thesis" format.thesis.type output.nonnull
  715.   school "school" output.check
  716.   address output
  717.   format.date "year" output.check
  718.   new.block
  719.   note output
  720.   fin.entry
  721. }
  722.  
  723. FUNCTION {proceedings}
  724. { output.bibitem
  725.   editor empty$
  726.     { format.organization output }
  727.     { format.editors output.nonnull }
  728.   if$
  729.   format.btitle "title" output.check
  730.   format.bvolume output
  731.   format.number.series output
  732.   address empty$
  733.     { editor empty$
  734.     'skip$
  735.     { organization output }
  736.       if$
  737.       publisher output
  738.       format.date "year" output.check
  739.     }
  740.     { address output.nonnull
  741.       format.date "year" output.check
  742.       editor empty$
  743.     'skip$
  744.     { organization output }
  745.       if$
  746.       publisher output
  747.     }
  748.   if$
  749.   new.block
  750.   note output
  751.   fin.entry
  752. }
  753.  
  754. FUNCTION {techreport}
  755. { output.bibitem
  756.   format.authors "author" output.check
  757.   format.title "title" output.check
  758.   format.tr.number output.nonnull
  759.   institution "institution" output.check
  760.   address output
  761.   format.date "year" output.check
  762.   new.block
  763.   note output
  764.   fin.entry
  765. }
  766.  
  767. FUNCTION {unpublished}
  768. { output.bibitem
  769.   format.authors "author" output.check
  770.   format.title "title" output.check
  771.   new.block
  772.   note "note" output.check
  773.   format.date output
  774.   fin.entry
  775. }
  776.  
  777. FUNCTION {default.type} { misc }
  778.  
  779. MACRO {jan} {"Jan."}
  780.  
  781. MACRO {feb} {"Feb."}
  782.  
  783. MACRO {mar} {"Mar."}
  784.  
  785. MACRO {apr} {"Apr."}
  786.  
  787. MACRO {may} {"May"}
  788.  
  789. MACRO {jun} {"June"}
  790.  
  791. MACRO {jul} {"July"}
  792.  
  793. MACRO {aug} {"Aug."}
  794.  
  795. MACRO {sep} {"Sept."}
  796.  
  797. MACRO {oct} {"Oct."}
  798.  
  799. MACRO {nov} {"Nov."}
  800.  
  801. MACRO {dec} {"Dec."}
  802.  
  803. MACRO {acmcs} {"ACM Comput. Surveys"}
  804.  
  805. MACRO {acta} {"Acta Inf."}
  806.  
  807. MACRO {cacm} {"Comm. ACM"}
  808.  
  809. MACRO {ibmjrd} {"IBM J. Res. Dev."}
  810.  
  811. MACRO {ibmsj} {"IBM Syst.~J."}
  812.  
  813. MACRO {ieeese} {"IEEE Trans. Softw. Eng."}
  814.  
  815. MACRO {ieeetc} {"IEEE Trans. Comput."}
  816.  
  817. MACRO {ieeetcad}
  818.  {"IEEE Trans. Comput.-Aided Design Integrated Circuits"}
  819.  
  820. MACRO {ipl} {"Inf. Process. Lett."}
  821.  
  822. MACRO {jacm} {"J.~Assoc. Comput. Mach."}
  823.  
  824. MACRO {jcss} {"J.~Comput. System Sci."}
  825.  
  826. MACRO {scp} {"Sci. Comput. Programming"}
  827.  
  828. MACRO {sicomp} {"SIAM J. Comput."}
  829.  
  830. MACRO {tocs} {"ACM Trans. Comput. Syst."}
  831.  
  832. MACRO {tods} {"ACM Trans. Database Syst."}
  833.  
  834. MACRO {tog} {"ACM Trans. Gr."}
  835.  
  836. MACRO {toms} {"ACM Trans. Math. Softw."}
  837.  
  838. MACRO {toois} {"ACM Trans. Office Inf. Syst."}
  839.  
  840. MACRO {toplas} {"ACM Trans. Prog. Lang. Syst."}
  841.  
  842. MACRO {tcs} {"Theoretical Comput. Sci."}
  843.  
  844. READ
  845.  
  846. FUNCTION {sortify}
  847. { purify$
  848.   "l" change.case$
  849. }
  850.  
  851. INTEGERS { len }
  852.  
  853. FUNCTION {chop.word}
  854. { 's :=
  855.   'len :=
  856.   s #1 len substring$ =
  857.     { s len #1 + global.max$ substring$ }
  858.     's
  859.   if$
  860. }
  861.  
  862. FUNCTION {sort.format.names}
  863. { 's :=
  864.   #1 'nameptr :=
  865.   ""
  866.   s num.names$ 'numnames :=
  867.   numnames 'namesleft :=
  868.     { namesleft #0 > }
  869.     { nameptr #1 >
  870.     { "   " * }
  871.     'skip$
  872.       if$
  873.       s nameptr "{vv{ } }{ll{ }}{  f{ }}{  jj{ }}" format.name$ 't :=
  874.       nameptr numnames = t "others" = and
  875.     { "et al" * }
  876.     { t sortify * }
  877.       if$
  878.       nameptr #1 + 'nameptr :=
  879.       namesleft #1 - 'namesleft :=
  880.     }
  881.   while$
  882. }
  883.  
  884. FUNCTION {sort.format.title}
  885. { 't :=
  886.   "A " #2
  887.     "An " #3
  888.       "The " #4 t chop.word
  889.     chop.word
  890.   chop.word
  891.   sortify
  892.   #1 global.max$ substring$
  893. }
  894.  
  895. FUNCTION {author.sort}
  896. { author empty$
  897.     { key empty$
  898.     { "to sort, need author or key in " cite$ * warning$
  899.       ""
  900.     }
  901.     { key sortify }
  902.       if$
  903.     }
  904.     { author sort.format.names }
  905.   if$
  906. }
  907.  
  908. FUNCTION {author.editor.sort}
  909. { author empty$
  910.     { editor empty$
  911.     { key empty$
  912.         { "to sort, need author, editor, or key in " cite$ * warning$
  913.           ""
  914.         }
  915.         { key sortify }
  916.       if$
  917.     }
  918.     { editor sort.format.names }
  919.       if$
  920.     }
  921.     { author sort.format.names }
  922.   if$
  923. }
  924.  
  925. FUNCTION {author.organization.sort}
  926. { author empty$
  927.     { organization empty$
  928.     { key empty$
  929.         { "to sort, need author, organization, or key in " cite$ * warning$
  930.           ""
  931.         }
  932.         { key sortify }
  933.       if$
  934.     }
  935.     { "The " #4 organization chop.word sortify }
  936.       if$
  937.     }
  938.     { author sort.format.names }
  939.   if$
  940. }
  941.  
  942. FUNCTION {editor.organization.sort}
  943. { editor empty$
  944.     { organization empty$
  945.     { key empty$
  946.         { "to sort, need editor, organization, or key in " cite$ * warning$
  947.           ""
  948.         }
  949.         { key sortify }
  950.       if$
  951.     }
  952.     { "The " #4 organization chop.word sortify }
  953.       if$
  954.     }
  955.     { editor sort.format.names }
  956.   if$
  957. }
  958.  
  959. FUNCTION {presort}
  960. { type$ "book" =
  961.   type$ "inbook" =
  962.   or
  963.     'author.editor.sort
  964.     { type$ "proceedings" =
  965.     'editor.organization.sort
  966.     { type$ "manual" =
  967.         'author.organization.sort
  968.         'author.sort
  969.       if$
  970.     }
  971.       if$
  972.     }
  973.   if$
  974.   "    "
  975.   *
  976.   year field.or.null sortify
  977.   *
  978.   "    "
  979.   *
  980.   title field.or.null
  981.   sort.format.title
  982.   *
  983.   #1 entry.max$ substring$
  984.   'sort.key$ :=
  985. }
  986.  
  987. ITERATE {presort}
  988.  
  989. SORT
  990.  
  991. STRINGS { longest.label }
  992.  
  993. INTEGERS { number.label longest.label.width }
  994.  
  995. FUNCTION {initialize.longest.label}
  996. { "" 'longest.label :=
  997.   #1 'number.label :=
  998.   #0 'longest.label.width :=
  999. }
  1000.  
  1001. FUNCTION {longest.label.pass}
  1002. { number.label int.to.str$ 'label :=
  1003.   number.label #1 + 'number.label :=
  1004.   label width$ longest.label.width >
  1005.     { label 'longest.label :=
  1006.       label width$ 'longest.label.width :=
  1007.     }
  1008.     'skip$
  1009.   if$
  1010. }
  1011.  
  1012. EXECUTE {initialize.longest.label}
  1013.  
  1014. ITERATE {longest.label.pass}
  1015.  
  1016. FUNCTION {begin.bib}
  1017. { preamble$ empty$
  1018.     'skip$
  1019.     { preamble$ write$ newline$ }
  1020.   if$
  1021.   "\begin{thebibliography}{"  longest.label  * "}" * write$ newline$
  1022. }
  1023.  
  1024. EXECUTE {begin.bib}
  1025.  
  1026. EXECUTE {init.state.consts}
  1027.  
  1028. EXECUTE {init.last.authors}
  1029.  
  1030. ITERATE {call.type$}
  1031.  
  1032. FUNCTION {end.bib}
  1033. { newline$
  1034.   "\end{thebibliography}" write$ newline$
  1035. }
  1036.  
  1037. EXECUTE {end.bib}
  1038.  
  1039.